<?php
App::uses('AuthComponent', 'Controller/Component');

class User extends AppModel {

	public $avatarUploadDir = 'img/avatars';

	public $validate = array(
		'username' => array(
			'nonEmpty' => array(
				'rule' => array('notEmpty'),
				'message' => 'Um nome de usuário é requerido',
				'allowEmpty' => false
			),
			'between' => array(
				'rule' => array('between', 5, 15),
				'required' => true,
				'message' => 'Nome de usuário deve conter entre 5 e 15 caracteres'
			),
			'unique' => array(
				'rule'    => array('isUniqueUsername'),
				'message' => 'Esse nome de usuário já esta em uso'
			),
			'alphaNumericDashUnderscore' => array(
				'rule'    => array('alphaNumericDashUnderscore'),
				'message' => 'Nome de usuário pode conter apenas letras, números e _'
			),
		),
		'password' => array(
			'required' => array(
				'rule' => array('notEmpty'),
				'message' => 'Uma senha é requerida',
				'on' => 'create'
			),
			'min_length' => array(
				'rule' => array('minLength', '6'),
				'message' => 'Senha deve conter no mínimo 6 caracteres'
			),
			'passwordIsCorrect' => array(
				'rule' => array('passwordIsCorrect'),
				'message' => 'A senha atual está incorreta',
				'required' => false
			)
		),
		'password_confirm' => array(
			'required' => array(
				'rule' => array('notEmpty'),
				'message' => 'Por favor, confirme sua senha',
				'on' => 'create'
			),
			'equaltofield' => array(
				'rule' => array('equaltofield','password'),
				'message' => 'As senhas digitadas precisam ser iguais'
			)
		),

		'email' => array(
			'required' => array(
				'rule' => array('email', true),
				'message' => 'Por favor, insira um endereço de e-mail válido'
			),
			'unique' => array(
				'rule'    => array('isUniqueEmail'),
				'message' => 'Esse e-mail já está em uso',
			),
			'between' => array(
				'rule' => array('between', 6, 60),
				'message' => 'E-mail deve conter entre 6 e 60 caracteres'
			)
		),
		'password_update' => array(
			'min_length' => array(
				'rule' => array('minLength', '6'),
				'message' => 'Senha deve conter no mínimo 6 caracteres',
				'required' => false
			)
		),
		'password_confirm_update' => array(
			'equaltofield' => array(
				'rule' => array('equaltofield','password_update'),
				'message' => 'As duas senhas precisam ser iguais',
				'required' => false
			)
		),
		'numero_endereco' => array(
			'rule' => 'numeric',
			'message' => 'Campo obrigatório',
    		'required' => true
		),
		'ddd' => array(
			'rule' => 'numeric',
			'message' => 'Campo obrigatório',
    	'required' => true
		),
		'cpf' => array(
			'CPFValido' => array(
				'rule' => array('CPFValido'),
				'message' => 'CPF Inválido'
			),
			'min_length' => array(
				'rule' => array('minLength', '11'),
				'message' => 'CPF deve conter 11 números'
			),
			'unique' => array(
				'rule'    => array('isUniqueCPF'),
				'message' => 'CPF já esta em uso'
			)
		),
		'telefone' => array(
			'min_length' => array(
				'rule' => array('minLength', '8'),
				'required' => true,
				'message' => 'Telefone deve conter no mínimo 8 números'
			),
			'max_length' => array(
				'rule' => array('maxLength', '9'),
				'message' => 'Telefone deve conter no máximo 9 números'
			),
		),
		'endereco' => array(
			'rule' => 'notEmpty',
			'message' => 'Campo obrigatório',
    	'required' => true
		),
		'nome' => array(
			'notEmpty' => array(	
				'rule' => 'notEmpty',
				'message' => 'Campo obrigatório',
				'required' => true
			),
			'fullName' => array(
				'rule'    => array('isFullName'),
				'message' => 'É necessário que você digite seu nome completo'
			),
		),
		'bairro' => array(
			'rule' => 'notEmpty',
			'message' => 'Campo obrigatório',
    	'required' => true
		),
		'cep' => array(
			'min_length' => array(
				'rule' => array('minLength', '8'),
				'required' => true,
				'message' => 'CEP deve conter 8 números'
			)
		),
		'cidade' => array(
			'rule' => 'notEmpty',
			'message' => 'Campo obrigatório',
    	'required' => true
		),
		'estado' => array(
			'rule' => 'notEmpty',
			'message' => 'Campo obrigatório',
    	'required' => true
		)
	);

	public $hasMany = array(
		'Mensagem' => array(
			'className' => 'Mensagem',
		),
		'Compra' => array(
			'className' => 'Compra',
			'foreignKey' => 'id_cliente'
		)
	);

	/**
	* Before isUniqueUsername
	* @param array $options
	* @return boolean
	*/
	function isUniqueUsername($check) {

		$username = $this->find(
		'first',
		array(
			'fields' => array(
				'User.id',
				'User.username'
			),
			'conditions' => array(
				'User.username' => $check['username']
			)
		)
	);

	if(!empty($username)){
		if(isset($this->data[$this->alias]['id'])){
			if($this->data[$this->alias]['id'] == $username['User']['id']){
				return true;
			}
		}
		return false;
	}else{
		return true;
	}
}

function isFullName($check){
	if(empty($check['nome'])) return false;
	
	$nome = explode(" ", $check['nome']);
	
	return (count($nome) > 1);
}

/**
* Before isUniqueEmail
* @param array $options
* @return boolean
*/
function isUniqueEmail($check) {

	$email = $this->find(
	'first',
	array(
		'fields' => array(
			'User.id'
		),
		'conditions' => array(
			'User.email' => $check['email']
		)
	)
);

if(!empty($email)){
	if(isset($this->data[$this->alias]['id'])){
		if($this->data[$this->alias]['id'] == $email['User']['id']){
			return true;
		}
	}
	return false;
}else{
	return true;
}
}

function CPFValido($check) {

    // Verifica se um número foi informado
    if(empty($check['cpf'])) {
        return false;
    }

    // Elimina possivel mascara
    $cpf = ereg_replace('[^0-9]', '', $check['cpf']);
    $cpf = str_pad($cpf, 11, '0', STR_PAD_LEFT);

    // Verifica se o numero de digitos informados é igual a 11
    if (strlen($cpf) != 11) {
        return false;
    }
    // Verifica se nenhuma das sequências invalidas abaixo
    // foi digitada. Caso afirmativo, retorna falso
    else if ($cpf == '00000000000' ||
        $cpf == '11111111111' ||
        $cpf == '22222222222' ||
        $cpf == '33333333333' ||
        $cpf == '44444444444' ||
        $cpf == '55555555555' ||
        $cpf == '66666666666' ||
        $cpf == '77777777777' ||
        $cpf == '88888888888' ||
        $cpf == '99999999999') {
        return false;
     // Calcula os digitos verificadores para verificar se o
     // CPF é válido
     } else {

        for ($t = 9; $t < 11; $t++) {

            for ($d = 0, $c = 0; $c < $t; $c++) {
                $d += $cpf{$c} * (($t + 1) - $c);
            }
            $d = ((10 * $d) % 11) % 10;
            if ($cpf{$c} != $d) {
                return false;
            }
        }

        return true;
    }
}

function isUniqueCPF($check) {

	$cpf = ereg_replace('[^0-9]', '', $check['cpf']);
	$cpf = str_pad($cpf, 11, '0', STR_PAD_LEFT);

	$cpf_check = $this->find(
	'first',
	array(
		'fields' => array(
			'User.id'
		),
		'conditions' => array(
			'User.cpf' => $cpf
		)
	)
);

if(!empty($cpf_check)){
	if(isset($this->data[$this->alias]['id'])){
		if($this->data[$this->alias]['id'] == $cpf_check['User']['id']){
			return true;
		}
	}
	return false;
}else{
	return true;
}
}

public function alphaNumericDashUnderscore($check) {
	// $data array is passed using the form field name as the key
	// have to extract the value to make the function generic
	$value = array_values($check);
	$value = $value[0];

	return preg_match('/^[a-zA-Z0-9_ \-]*$/', $value);
}

public function equaltofield($check,$otherfield)
{
	//get name of field
	$fname = '';
	foreach ($check as $key => $value){
		$fname = $key;
		break;
	}
	return $this->data[$this->name][$otherfield] === $this->data[$this->name][$fname];
}

public function passwordIsCorrect($check){
	if(!isset($this->data[$this->name]['password_update'])){
		return true;
	}
	
	$this->id = AuthComponent::user('id');
    $password = $this->field('password');
    return (AuthComponent::password($this->data[$this->name]['password']) == $password);
}

/**
* Before Save
* @param array $options
* @return boolean
*/
public function beforeSave($options = array()) {
	// hash our password
	if (isset($this->data[$this->alias]['password'])) {
		$this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
	}

	// if we get a new password, hash it
	if (isset($this->data[$this->alias]['password_update'])) {
		$this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password_update']);
	}

	if(isset($this->data[$this->alias]['role']) && $this->data[$this->alias]['role'] == 'admin'){
		$this->data[$this->alias]['role'] = 'admin';
	} else {
		$this->data[$this->alias]['role'] = 'cliente';
	}

	$cpf = ereg_replace('[^0-9]', '', $this->data[$this->alias]['cpf']);
	$cpf = str_pad($cpf, 11, '0', STR_PAD_LEFT);

	$this->data[$this->alias]['cpf'] = $cpf;

	// fallback to our parent
	return parent::beforeSave($options);
}

}

?>
